#pragma once

#include "MurmurHash3.h"
#include <map>
#include <iostream>
#include <mutex>
#include <atomic>

class BackendSession;

class ConsistentHash
{
public:
    ConsistentHash(int virtualNodeNum) : virtualNodeNum_(virtualNodeNum) { }
    ~ConsistentHash() { serverNodeMap_[0].clear(); serverNodeMap_[1].clear(); }

    // 移除服务器
    void removeNode(const BackendSession* servNode, int index);
    // 添加服务器
    void addNode(BackendSession* servNode, int index);
    // 选择服务器
    BackendSession* selectServer(const std::string clnt_addr);

    void modify(BackendSession* servNode, int flag);

private:
    std::map<uint32_t, BackendSession*> serverNodeMap_[2];   // hash值 node
    int nodeNum_;       // 真实服务器数目
    int virtualNodeNum_; // 每个服务器节点关联的虚拟节点个数

    std::atomic<int> index_; //0,1
    std::mutex modify_mutex_; 
};